package com.york.tinyrpc.protoss.proxy;

import com.york.tinyrpc.protoss.TinyRpcApplication;

import java.lang.reflect.Proxy;

/**
 * 服务代理工厂
 * 根据RPC接口类型获取代理对象，依赖ServiceProxy代理
 * 根据RPC配置得到是否开启mock功能，可以返回Mock对象
 */
public class ServiceProxyFactory {

    /**
     * 根据服务类获取代理对象
     *
     * @param serviceClass 接口类型
     * @return 接口类型的代理对象
     */
    public static <T> T getProxy(Class<T> serviceClass) {
        // 是否开启Mock服务
        boolean enableMock = TinyRpcApplication.getRpcConfig().isMock();
        if (enableMock) {
            return getMockProxy(serviceClass);
        }
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new TinyRpcServiceHandler());
    }

    /**
     * 根据服务类获取Mock代理对象
     *
     * @param serviceClass 接口类型
     * @return 接口类型的代理对象
     */
    public static <T> T getMockProxy(Class<T> serviceClass) {
        return (T) Proxy.newProxyInstance(
                serviceClass.getClassLoader(),
                new Class[]{serviceClass},
                new MockServiceHandler());
    }
}